home *** CD-ROM | disk | FTP | other *** search
/ Apple WWDC 1996 / WWDC96_1996 (CD).toast / Technology Materials / MacApp Release 10 / MacApp Release 10 - HD Ready / Libraries / MPWTool / Sources / UCPlusTool.cp
Encoding:
Text File  |  1996-04-03  |  11.8 KB  |  460 lines  |  [TEXT/MPS ]

  1. //----------------------------------------------------------------------------------------
  2. // UCPlusTool.cp
  3. // Copyright © 1988-96 by Apple Computer, Inc. All rights reserved.
  4. //----------------------------------------------------------------------------------------
  5.  
  6. #ifndef __UCPLUSTOOL__
  7. #include "UCPlusTool.h"
  8. #endif
  9.  
  10. // MacApp
  11.  
  12. #ifndef __UASSOCIATION__
  13. #include "UAssociation.h"
  14. #endif
  15.  
  16. #ifndef __UCOREGLOBALS__
  17. #include "UCoreGlobals.h"
  18. #endif
  19.  
  20. #ifndef __UCOREUTILITIES__
  21. #include "UCoreUtilities.h"
  22. #endif
  23.  
  24. #ifndef __UNIVERSALSTARTUP__
  25. #include "UniversalStartup.h"
  26. #endif
  27.  
  28. // Toolbox
  29.  
  30. #ifndef __CURSORCTL__
  31. #include <CursorCtl.h>
  32. #endif
  33.  
  34. #ifndef __ERRMGR__
  35. #include <ErrMgr.h>
  36. #endif
  37.  
  38. #ifndef __FONTS__
  39. #include <Fonts.h>
  40. #endif
  41.  
  42. #ifndef __RESOURCES__
  43. #include <Resources.h>
  44. #endif
  45.  
  46. // ANSI
  47.  
  48. #ifndef __SIGNAL__
  49. #include <signal.h>
  50. #endif
  51.  
  52. #ifndef __STDIO__
  53. #include <stdio.h>
  54. #endif
  55.  
  56. #ifndef __STDLIB__
  57. #include <stdlib.h>
  58. #endif
  59.  
  60. //========================================================================================
  61. // GLOBAL Variables
  62. //========================================================================================
  63.  
  64. #if !defined(__MWERKS__)
  65. QDGlobals qd;
  66. #endif
  67.  
  68. // Global variables defined so that storage is allocated:
  69. const char* gCPlusToolVersion = "1.0";
  70. const char* kErrorMarker = "### ";
  71. TCPlusTool* gCPlusTool;
  72.  
  73. //========================================================================================
  74. // GLOBAL Procedures
  75. //========================================================================================
  76. extern "C" void Intr(int);
  77.  
  78. #undef Inherited
  79.  
  80. //----------------------------------------------------------------------------------------
  81. // InitUCPlusTool:
  82. //----------------------------------------------------------------------------------------
  83. #pragma segment TInit
  84.  
  85. void InitUCPlusTool()
  86. {
  87.     // Do Tool related initialization 
  88.     InitGraf(&qd.thePort);
  89.     SetFScaleDisable(TRUE);                            // per chapter in MPW guide on tools 
  90.  
  91.     InitCursorCtl(NULL);
  92.     RotateCursor(0);
  93.  
  94.     InitErrMgr("", "", FALSE);
  95.  
  96.     // -1 == 0xFFFFFFFF, the largest 32 bit address. Our routine StripLong uses a
  97.     // pre-stripped address gStrippedAddress to avoid the yucky MPW glue. 
  98.  
  99.     gStrippedAddress = StripAddress((Ptr) -1);
  100.  
  101.     // Find out just what kind of environment we're dealing with here 
  102.     if (!ValidateProcessor())
  103.         ; // do something
  104.     if (!ValidateConfiguration())
  105.         ; // do something
  106.  
  107.     // The refnum where the application's resources should be found 
  108.     gApplicationRefNum = MACurResFile();
  109.  
  110.     gToolBoxInitialized = TRUE;
  111.  
  112.     // Do Object related initialization 
  113.     gSizeObjectHeap = 32000;
  114.     gSizeHeapIncrement = 32000;
  115.  
  116.     InitUObject();
  117. } // InitUCPlusTool
  118.  
  119.  
  120. //----------------------------------------------------------------------------------------
  121. // Intr:
  122. //----------------------------------------------------------------------------------------
  123. #pragma segment TRes
  124.  
  125. void Intr(int)
  126. {
  127.     gCPlusTool->fInterrupted = TRUE;                    // we test this switch periodically
  128. } // Intr
  129.  
  130.  
  131. //========================================================================================
  132. // CLASS TCPlusTool
  133. //========================================================================================
  134. #undef Inherited
  135. #define Inherited TObject
  136.  
  137. #pragma segment TInit
  138. MA_DEFINE_CLASS_M1(TCPlusTool, Inherited);
  139.  
  140. //----------------------------------------------------------------------------------------
  141. // TCPlusTool::Stop:
  142. //----------------------------------------------------------------------------------------
  143. #pragma segment TRes
  144.  
  145. void TCPlusTool::Stop(const CStr255& msg)
  146. {
  147.     if (msg.Length() > 0)
  148.         fprintf(stderr, "\n%s\n", (const char*)msg);
  149.  
  150.     if (fInterrupted)
  151.         exit(-9);
  152.  
  153.     // don't worry about closing the files we opened. The Shell will do so if appropriate.
  154.     exit((short)fRetCode);                        // exit, returning the appropriate status code
  155. } // TCPlusTool::Stop
  156.  
  157. //----------------------------------------------------------------------------------------
  158. // TCPlusTool::SyntaxError:
  159. //----------------------------------------------------------------------------------------
  160. #pragma segment TInit
  161.  
  162. void TCPlusTool::SyntaxError(const CStr255& suffix)
  163. {
  164.     CStr255 aStr = fProgName;
  165.  
  166.     fprintf(stderr, "%s Bad Parameter: %s\n", kErrorMarker, (const char*)suffix);
  167.     fprintf(stderr, "%s %s<invalid option>\n", kErrorMarker, (const char*)aStr);
  168.     Stop("");
  169. } // TCPlusTool::SyntaxError
  170.  
  171. //----------------------------------------------------------------------------------------
  172. // TCPlusTool::DoShowUsage:
  173. //----------------------------------------------------------------------------------------
  174. #pragma segment TInit
  175.  
  176. void TCPlusTool::DoShowUsage()
  177. {
  178.     fprintf(stderr, "# Usage: %s [-p]\n", (const char*)fProgName);
  179. } // TCPlusTool::DoShowUsage
  180.  
  181. //----------------------------------------------------------------------------------------
  182. // TCPlusTool::GetNextArg:
  183. //----------------------------------------------------------------------------------------
  184. #pragma segment TInit
  185.  
  186. void TCPlusTool::GetNextArg(CStr255& nextArg)
  187. {
  188.     if (++fArgvIndex > fArgc)
  189.         Stop("         Not enough arguments ");
  190.     nextArg = fArgv[fArgvIndex];
  191. } // TCPlusTool::GetNextArg
  192.  
  193. //----------------------------------------------------------------------------------------
  194. // TCPlusTool::InstallKeyWords:
  195. //----------------------------------------------------------------------------------------
  196. #pragma segment TInit
  197.  
  198. void TCPlusTool::InstallKeyWords()
  199. {
  200.     KeyWordStruct keywords [] =
  201.     {
  202.         {"Help", kwHelp},
  203.         {"P", kwP},                {"NoP", kwNoP},
  204.         {"T", kwT},                {"NoT", kwNoT}
  205.     };
  206.     
  207.     for (short i = 0; i < sizeof(keywords) / sizeof(KeyWordStruct); i++)
  208.         InstallKeyWord(keywords[i].keyword, keywords[i].keyvalue);
  209. } // TCPlusTool::InstallKeyWords
  210.  
  211. //----------------------------------------------------------------------------------------
  212. // TCPlusTool::InstallKeyWord:
  213. //----------------------------------------------------------------------------------------
  214. #pragma segment TInit
  215.  
  216. void TCPlusTool::InstallKeyWord(const CStr255& keyword,
  217.                                      short kw)
  218. {
  219.     CStr255 upperKeyWord(keyword);
  220.     UprStr255(upperKeyWord);
  221.  
  222.     fKeyWordList->InsertEntry(upperKeyWord, (unsigned short)kw);
  223. } // TCPlusTool::InstallKeyWord
  224.  
  225. //----------------------------------------------------------------------------------------
  226. // TCPlusTool::LookupKeyword:
  227. //----------------------------------------------------------------------------------------
  228. #pragma segment TInit
  229.  
  230. Boolean TCPlusTool::LookupKeyword(const CStr255& keyword,
  231.                                        short& kw)
  232. {
  233.     Boolean returnVal = FALSE;
  234.  
  235.     CStr255 upperKeyWord(keyword);
  236.     UprStr255(upperKeyWord);
  237.  
  238.     CStr255 value;
  239.     if (fKeyWordList->ValueAt(upperKeyWord, value))
  240.     {
  241.         kw = value.ToUShort();
  242.         returnVal = TRUE;
  243.     }
  244.  
  245.     return returnVal;
  246. } // TCPlusTool::LookupKeyword
  247.  
  248. //----------------------------------------------------------------------------------------
  249. // TCPlusTool::ProcessArg:
  250. //----------------------------------------------------------------------------------------
  251. #pragma segment TInit
  252.  
  253. void TCPlusTool::ProcessArg(const CStr255& arg)
  254. {
  255.     if (arg[1] != '-')
  256.         DoProcessFileArg(arg);
  257.     else
  258.     {
  259.         short akw;
  260.         CStr255 realArg(arg);
  261.  
  262.         realArg.Delete(1,1);                    // delete the '-'
  263.         if (LookupKeyword(realArg, akw))
  264.             DoProcessOptionArg(akw);
  265.         else
  266.             SyntaxError(arg + " < invalid option > ");
  267.     }
  268. } // TCPlusTool::ProcessArg
  269.  
  270. //----------------------------------------------------------------------------------------
  271. // TCPlusTool::DoProcessFileArg:
  272. //----------------------------------------------------------------------------------------
  273. #pragma segment TInit
  274.  
  275. void TCPlusTool::DoProcessFileArg(const CStr255& arg)
  276. {
  277.     SyntaxError(arg + " < invalid option > ");
  278. } // TCPlusTool::DoProcessFileArg
  279.  
  280. //----------------------------------------------------------------------------------------
  281. // TCPlusTool::DoProcessOptionArg:
  282. //----------------------------------------------------------------------------------------
  283. #pragma segment TInit
  284.  
  285. void TCPlusTool::DoProcessOptionArg(short kw)
  286. {
  287.     switch (kw)
  288.     {
  289.         case kwP:
  290.             fProgress = TRUE;
  291.             break;
  292.         case kwNoP:
  293.             fProgress = FALSE;
  294.             break;
  295.         case kwT:
  296.             fTime = TRUE;
  297.             break;
  298.         case kwNoT:
  299.             fTime = FALSE;
  300.             break;
  301.         case kwHelp:
  302.             DoShowUsage();
  303.             fRetCode = RC_Normal;
  304.             Stop("         ");
  305.             break;
  306.         default:
  307.             SyntaxError(CStr255(fArgv[fArgvIndex]) + CStr255(" < invalid option > "));
  308.     }
  309. } // TCPlusTool::DoProcessOptionArg
  310.  
  311. //----------------------------------------------------------------------------------------
  312. // TCPlusTool::DoStartProgress:
  313. //----------------------------------------------------------------------------------------
  314. #pragma segment TInit
  315.  
  316. void TCPlusTool::DoStartProgress()
  317. {
  318.     fprintf(stderr, "\n%s (Ver %s) \n\n\n", (const char*)fProgName, gCPlusToolVersion);
  319. } // TCPlusTool::DoStartProgress
  320.  
  321. //----------------------------------------------------------------------------------------
  322. // TCPlusTool::DoToolAction
  323. //----------------------------------------------------------------------------------------
  324. #pragma segment TRes
  325.  
  326. void TCPlusTool::DoToolAction()
  327. {
  328.     SubClassResponsibility();
  329. } // TCPlusTool::DoToolAction
  330.  
  331. //----------------------------------------------------------------------------------------
  332. // TCPlusTool constructor
  333. //----------------------------------------------------------------------------------------
  334. #pragma segment TInit
  335.  
  336. TCPlusTool::TCPlusTool()
  337. {
  338.     fArgc = 0;
  339.     fArgv = NULL;
  340.     fArgvIndex = 0;
  341.     fCursorCount = 0;                            // prepare to spin that cursor
  342.     fInterrupted = FALSE;                        // becomes true when interrupted
  343.     fKeyWordList = NULL;                        // keywords to this command 
  344.     fProgress = FALSE;
  345.     fRetCode = RC_Normal;
  346.     fStartDateTime = 0;                            // Date/Time at start of tool 
  347.     fStartTicks = 0;                            // tickcount at start of tool 
  348.     fTime = FALSE;
  349. } // TCPlusTool::TCPlusTool
  350.  
  351. //----------------------------------------------------------------------------------------
  352. // TCPlusTool destructor
  353. //----------------------------------------------------------------------------------------
  354. #pragma segment MADestructorRes
  355.  
  356. TCPlusTool::~TCPlusTool()
  357. {
  358. }
  359.  
  360. //----------------------------------------------------------------------------------------
  361. // TCPlusTool::ICPlusTool:
  362. //----------------------------------------------------------------------------------------
  363. #pragma segment TInit
  364.  
  365. void TCPlusTool::ICPlusTool(int argc, char** argv)
  366. {
  367.     IObject();
  368.  
  369.     gCPlusTool = this;
  370.  
  371.     fArgc = argc;
  372.     fArgv = argv;
  373.  
  374.     fStartTicks = TickCount();
  375.  
  376.     unsigned long theDateTime;
  377.     GetDateTime(&theDateTime);
  378.     fStartDateTime = theDateTime;
  379.  
  380.     SpinCursor(1);
  381.     signal(SIGINT, &Intr);
  382.  
  383.     fProgName = argv[fArgvIndex];
  384.     fRetCode = RC_ParmErrs;
  385.  
  386.     if (fInterrupted)
  387.         Stop("");
  388.  
  389.     FailInfo fi;
  390.     Try(fi)
  391.     {
  392.         TAssociation* anAssociation = new TAssociation;
  393.         anAssociation->IAssociation();
  394.         fKeyWordList = anAssociation;
  395.         fi.Success();
  396.     }
  397.     else
  398.     {
  399.         Free();
  400.         fi.ReSignal();
  401.     }
  402.  
  403.     InstallKeyWords();
  404. } // TCPlusTool::ICPlusTool
  405.  
  406. //----------------------------------------------------------------------------------------
  407. // TCPlusTool::Run:
  408. //----------------------------------------------------------------------------------------
  409. #pragma segment TRes
  410.  
  411. void TCPlusTool::Run()
  412. {
  413.     FailInfo fi;
  414.     Try(fi)
  415.     {
  416.         while (++fArgvIndex < fArgc)        // fArgc is the number of args plus one
  417.         {
  418.             RotateCursor(++fCursorCount);
  419.             ProcessArg(fArgv[fArgvIndex]);
  420.         }
  421.  
  422.         UnloadSeg(&InitUCPlusTool);
  423.         fRetCode = RC_Normal;
  424.  
  425.         if (fProgress)
  426.             DoStartProgress();
  427.  
  428.         DoToolAction();
  429.  
  430.         if (fTime)
  431.         {
  432.             long currentTicks = TickCount();
  433.             long elapsedTicks = currentTicks - fStartTicks;
  434.             long double elapsedSecs = (double)elapsedTicks / 60.0;
  435.             fprintf(stderr, "Elapsed time: %-1.2Lf seconds\n", elapsedSecs);
  436.         }
  437.  
  438.         fi.Success();
  439.     }
  440.     else
  441.     {
  442.         OSErr theErr = fi.error;
  443.         CChar255 theText;
  444.  
  445.         if (theErr != noErr)
  446.         {
  447.             GetSysErrText(theErr, theText);
  448.             fprintf(stderr, "%s %s: %s\n", kErrorMarker, (const char*)fProgName, theText);
  449.             fRetCode = RC_Abort;
  450.         }
  451.     }
  452.  
  453.     exit((short)fRetCode);
  454. } // TCPlusTool::Run
  455.  
  456. //----------------------------------------------------------------------------------------
  457. // End of UCPlusTool.cp
  458.  
  459. #pragma segment Inline
  460.